//给定两个整数 a 和 b ，求它们的除法的商 a/b ，要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。
//
//
//
// 注意：
//
//
// 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
// 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−2³¹, 2³¹−1]。本题中，如果除法结果溢出，则返回 231 − 1
//
//
//
//
// 示例 1：
//
//
//输入：a = 15, b = 2
//输出：7
//解释：15/2 = truncate(7.5) = 7
//
//
// 示例 2：
//
//
//输入：a = 7, b = -3
//输出：-2
//解释：7/-3 = truncate(-2.33333..) = -2
//
// 示例 3：
//
//
//输入：a = 0, b = 1
//输出：0
//
// 示例 4：
//
//
//输入：a = 1, b = 1
//输出：1
//
//
//
// 提示:
//
//
// -2³¹ <= a, b <= 2³¹ - 1
// b != 0
//
//
//
//
// 注意：本题与主站 29 题相同：https://leetcode-cn.com/problems/divide-two-integers/
//
//
//
// Related Topics 位运算 数学 👍 261 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function divide(a: number, b: number): number {

    /**
     * @param {number} a
     * @param {number} b
     * @return {number}
     */
    if (!a) {
        return 0
    }
    //? 将a与b转化都为负数（都转为正数也可以）时，同时确定a、b是否同号（flag）
    let flag = true
    if (a > 0) {
        a = -a
        flag = !flag
    }
    if (b > 0) {
        b = -b
        flag = !flag
    }
    //? 由于最后一次res的+1为退出循环时的条件，不应该记录进最终结果，因此可以将res初始值记为-1
    let res = -1
    while (a <= 0) {
        let tempB = b, temp = 1
        //? 将b进行翻倍得到tempB，翻倍条件是a < tempB + tempB，temp记录倍数
        while (a < tempB + tempB) {
            tempB += tempB
            temp += temp
        }
        //? 减掉
        a -= tempB
        //? 将倍数加在结果上
        res += temp
    }
    //? 最后根据是否同号flag返回对应的res正负数，同时还应该判断溢出结果MIN、MAX
    res = flag ? res : -res
    const MAX = Math.pow(2, 31) - 1, MIN = -Math.pow(2, 31)
    return res < MIN || res > MAX ? MAX : res

};
//leetcode submit region end(Prohibit modification and deletion)
